home *** CD-ROM | disk | FTP | other *** search
/ isnet Internet / Isnet Internet CD.iso / prog / hiz / 09 / 09.exe / adynware.exe / perl / lib / syslog.pl < prev    next >
Encoding:
Perl Script  |  1999-12-28  |  4.0 KB  |  170 lines

  1.  
  2. package syslog;
  3.  
  4. $host = 'localhost' unless $host;    # set $syslog'host to change
  5.  
  6. if ($] >= 5) {
  7.     warn "You should 'use Sys::Syslog' instead; continuing" # if $^W
  8.  
  9. require 'syslog.ph';
  10.  
  11.  eval 'use Socket; 1'             ||
  12.      eval { require "socket.ph" }     ||
  13.      require "sys/socket.ph";
  14.  
  15. $maskpri = &LOG_UPTO(&LOG_DEBUG);
  16.  
  17. sub main'openlog {
  18.     ($ident, $logopt, $facility) = @_;  # package vars
  19.     $lo_pid = $logopt =~ /\bpid\b/;
  20.     $lo_ndelay = $logopt =~ /\bndelay\b/;
  21.     $lo_cons = $logopt =~ /\bcons\b/;
  22.     $lo_nowait = $logopt =~ /\bnowait\b/;
  23.     &connect if $lo_ndelay;
  24.  
  25. sub main'closelog {
  26.     $facility = $ident = '';
  27.     &disconnect;
  28.  
  29. sub main'setlogmask {
  30.     local($oldmask) = $maskpri;
  31.     $maskpri = shift;
  32.     $oldmask;
  33. }
  34.  
  35. sub main'syslog {
  36.     local($priority) = shift;
  37.     local($mask) = shift;
  38.     local($message, $whoami);
  39.     local(@words, $num, $numpri, $numfac, $sum);
  40.     local($facility) = $facility;    # may need to change temporarily.
  41.  
  42.     die "syslog: expected both priority and mask" unless $mask && $priority;
  43.  
  44.     @words = split(/\W+/, $priority, 2);# Allow "level" or "level|facility".
  45.     undef $numpri;
  46.     undef $numfac;
  47.     foreach (@words) {
  48.     $num = &xlate($_);        # Translate word to number.
  49.     if (/^kern$/ || $num < 0) {
  50.         die "syslog: invalid level/facility: $_\n";
  51.     }
  52.     elsif ($num <= &LOG_PRIMASK) {
  53.         die "syslog: too many levels given: $_\n" if defined($numpri);
  54.         $numpri = $num;
  55.         return 0 unless &LOG_MASK($numpri) & $maskpri;
  56.     }
  57.     else {
  58.         die "syslog: too many facilities given: $_\n" if defined($numfac);
  59.         $facility = $_;
  60.         $numfac = $num;
  61.     }
  62.     }
  63.  
  64.     die "syslog: level must be given\n" unless defined($numpri);
  65.  
  66.     if (!defined($numfac)) {    # Facility not specified in this call.
  67.     $facility = 'user' unless $facility;
  68.     $numfac = &xlate($facility);
  69.     }
  70.  
  71.     &connect unless $connected;
  72.  
  73.     $whoami = $ident;
  74.  
  75.     if (!$ident && $mask =~ /^(\S.*):\s?(.*)/) {
  76.     $whoami = $1;
  77.     $mask = $2;
  78.     } 
  79.  
  80.     unless ($whoami) {
  81.     ($whoami = getlogin) ||
  82.         ($whoami = getpwuid($<)) ||
  83.         ($whoami = 'syslog');
  84.     }
  85.  
  86.     $whoami .= "[$$]" if $lo_pid;
  87.  
  88.     $mask =~ s/%m/$!/g;
  89.     $mask .= "\n" unless $mask =~ /\n$/;
  90.     $message = sprintf ($mask, @_);
  91.  
  92.     $sum = $numpri + $numfac;
  93.     unless (send(SYSLOG,"<$sum>$whoami: $message",0)) {
  94.     if ($lo_cons) {
  95.         if ($pid = fork) {
  96.         unless ($lo_nowait) {
  97.             do {$died = wait;} until $died == $pid || $died < 0;
  98.         }
  99.         }
  100.         else {
  101.         open(CONS,">/dev/console");
  102.         print CONS "<$facility.$priority>$whoami: $message\r";
  103.         exit if defined $pid;        # if fork failed, we're parent
  104.         close CONS;
  105.         }
  106.     }
  107.     }
  108. }
  109.  
  110. sub xlate {
  111.     local($name) = @_;
  112.     $name = uc $name;
  113.     $name = "LOG_$name" unless $name =~ /^LOG_/;
  114.     $name = "syslog'$name";
  115.     defined &$name ? &$name : -1;
  116. }
  117.  
  118. sub connect {
  119.     $pat = 'S n C4 x8';
  120.  
  121.     $af_unix = &AF_UNIX;
  122.     $af_inet = &AF_INET;
  123.  
  124.     $stream = &SOCK_STREAM;
  125.     $datagram = &SOCK_DGRAM;
  126.  
  127.     ($name,$aliases,$proto) = getprotobyname('udp');
  128.     $udp = $proto;
  129.  
  130.     ($name,$aliases,$port,$proto) = getservbyname('syslog','udp');
  131.     $syslog = $port;
  132.  
  133.     if (chop($myname = `hostname`)) {
  134.     ($name,$aliases,$addrtype,$length,@addrs) = gethostbyname($myname);
  135.     die "Can't lookup $myname\n" unless $name;
  136.     @bytes = unpack("C4",$addrs[0]);
  137.     }
  138.     else {
  139.     @bytes = (0,0,0,0);
  140.     }
  141.     $this = pack($pat, $af_inet, 0, @bytes);
  142.  
  143.     if ($host =~ /^\d+\./) {
  144.     @bytes = split(/\./,$host);
  145.     }
  146.     else {
  147.     ($name,$aliases,$addrtype,$length,@addrs) = gethostbyname($host);
  148.     die "Can't lookup $host\n" unless $name;
  149.     @bytes = unpack("C4",$addrs[0]);
  150.     }
  151.     $that = pack($pat,$af_inet,$syslog,@bytes);
  152.  
  153.     socket(SYSLOG,$af_inet,$datagram,$udp) || die "socket: $!\n";
  154.     bind(SYSLOG,$this) || die "bind: $!\n";
  155.     connect(SYSLOG,$that) || die "connect: $!\n";
  156.  
  157.     local($old) = select(SYSLOG); $| = 1; select($old);
  158.     $connected = 1;
  159. }
  160.  
  161. sub disconnect {
  162.     close SYSLOG;
  163.     $connected = 0;
  164. }
  165.  
  166. 1;
  167.